package cn.dai.Reflection;

import org.junit.Test;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;

/**
 * @author ArkD42
 * @file 1 - Java基础语法
 * @create 2020 - 04 - 22 - 22:05
 */
public class ReflectTest {

    @Test
    public void reflect() throws Exception {
        // class属性可返回这个类的类对象
        Class<Person> personClass = Person.class;

        // 获取这个类的构造器类的对象，这里获取的是全参构造器
        Constructor<Person> personClassConstructor = personClass.getConstructor(String.class, int.class, boolean.class);

        // 调用构造器，创建Person对象
        Person person = personClassConstructor.newInstance("杰哥", 28, true);

        // 调用Person对象的toString();
        System.out.println(person.toString());

        // 通过反射，调用对象指定的属性，方法
        Field age = personClass.getDeclaredField("age");

        // 解开访问权限 要在访问前设置，否则无意义
        age.setAccessible(true);

        // 通过类的字段类实例，调用参数实例age字段，修改值
        // 发现异常报错 private无法访问
        // Class cn.dai.Reflection.ReflectTest can not access a member of class cn.dai.Reflection.Person with modifiers "private"
        age.set(person,10);
        System.out.println(person);
    }
}
